package com.mes.spc.util;

import com.yy.base.exception.BaseException;
import org.apache.poi.POIXMLDocument;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.PushbackInputStream;
import java.util.Date;
import java.util.List;

public class SPCExcelUtil {
	private boolean parseAll = false;
	public File createExcel(String[] titles, List<String[]> values) {
		SPCExcelWriteUtil excel = new SPCExcelWriteUtil();
		excel.createExcel(titles, values);
		
		try {
			String filePath = SPCExcelUtil.class.getResource(new Date().getTime() + ".xlsx").getPath();
			excel.writeFile(filePath);
			return new File(filePath);
		} catch (Exception e) {
			throw new BaseException(e);
		}
	}
	/**
	 * 解析Excel
	 * file: 文件
	 */
	public List<String[]> parseExcel(File file) {
		return parseExcel(file, 0);
	}
	/**
	 * 解析Excel
	 * file: 文件
	 */
	public List<String[]> parseExcel(String filePath) {
		return parseExcel(new File(filePath), 0);
	}
	/**
	 * 是否解析所有sheet
	 */
	public void setParseAllSheet(boolean bool) {
		this.parseAll = bool;
	}
	/**
	 * 解析Excel
	 * file: 文件
	 * startRow： 开始行
	 */
	public List<String[]> parseExcel(File file, int startRow) {
		try {
			if (isExcel2007(file)) {
				return parseXlsx(file);
			} else {
				return parseXls(file);
			}
		} catch (Exception e) {
			throw new BaseException("文件读取错误。详细错误!", e);
		}
	}
	//判断文件是否是excel2007版本
	private boolean isExcel2007(File file) {
		InputStream inp = null;
		try {
			inp = new FileInputStream(file);
	        if (!inp.markSupported()) {
	            inp = new PushbackInputStream(inp, 8);
	        }
	        if (POIFSFileSystem.hasPOIFSHeader(inp)) {
	            return false;
	        }
	        if (POIXMLDocument.hasOOXMLHeader(inp)) {
	            return true;
	        }
		} catch (Exception e) {
	        throw new BaseException(e);
		} finally {
			try {
				if (inp != null) {
					inp.close();
				}
			} catch (Exception e) {
			}
		}
        throw new BaseException("无法判断excel版本，或文件非excel文件！");
	}
	/**
	 * 解析Excel2007
	 */
	private List<String[]> parseXlsx(File file) {
		SPCParseExcel2007 parse = new SPCParseExcel2007();
		parse.setParseAllSheet(parseAll);
		return parse.parseExcel(file);
	}
	/**
	 * 解析Excel2003
	 */
	private List<String[]> parseXls(File file) {
		SPCParseExcel2003 parse = new SPCParseExcel2003();
		parse.setParseAllSheet(parseAll);
		return parse.parseExcel(file);
	}
}